/*
 * Copyright (C) 2012 POAS.VSTU
 */
package model;

import java.util.EventObject;

/** Событие игрового процесса. */
public class GameProcessEvent extends EventObject {

    /** Игрок. */
    private Player mPlayer;

    /** Игрок, который получает ход. */
    private Player mNextPlayer = null;

    /** Карта, которую проверяет игрок. */
    private Card mCard = null;

    /** Решение игрока. */
    private boolean mDecisionBelieve = false;

    /** Принак, что игрок начал ход. */
    private boolean mTurnStarted = false;

    /** Принак, что игрок закончил ход. */
    private boolean mTurnEnded = false;

    public GameProcessEvent (Object source) {
        super(source);
    }

    /**
     * Конструктор события игрового процесса.
     *
     * Событие для решения игрока верить-не верить.
     *
     * @param source источник события
     * @param player игрок, который принимает решение
     * @param decisionBelieve true, если игрок верит, иначе false
     */
    public GameProcessEvent (Object source, Player player, boolean decisionBelieve) {
        super(source);
        mPlayer = player;
        mDecisionBelieve = decisionBelieve;
    }

    /**
     * Игровое событие Решение игрока.
     *
     * @param source источник события
     * @param player игрок, который принял решение.
     * @param decisionBelieve true, если игрок принял решение верить, иначе false
     * @return событие
     */
    static public GameProcessEvent playerDecisionBelieve(Object source, Player player, boolean decisionBelieve) {
        GameProcessEvent gameProcessEvent = new GameProcessEvent(source);
        gameProcessEvent.mDecisionBelieve = decisionBelieve;
        gameProcessEvent.mPlayer = player;
        return gameProcessEvent;
    }

    /**
     * Игровое событие "игрок закончил свой ход".
     *
     * @param source источник события
     * @param player игрок, который принял решение.
     * @return событие
     */
    static public GameProcessEvent playerTurnEnded(Object source, Player player) {
        GameProcessEvent gameProcessEvent = new GameProcessEvent(source);
        gameProcessEvent.mPlayer = player;
        gameProcessEvent.mTurnEnded = true;
        return gameProcessEvent;
    }

    /**
     * Игровое событие "игрок начинает свой ход".
     *
     * @param source источник события
     * @param player игрок, который принял решение.
     * @return событие
     */
    static public GameProcessEvent playerTurnStarted(Object source, Player player) {
        GameProcessEvent gameProcessEvent = new GameProcessEvent(source);
        gameProcessEvent.mPlayer = player;
        gameProcessEvent.mTurnStarted = true;
        return gameProcessEvent;
    }

    /**
     * Игровое событие "игрок передает ход следующему игроку".
     *
     * @param source источник события
     * @param playerFrom игрок, который передает ход.
     * @param playerTo игрок, которому передают ход.
     * @return событие
     */
    static public GameProcessEvent playerPassedTurn(Object source, Player playerFrom, Player playerTo) {
        GameProcessEvent gameProcessEvent = new GameProcessEvent(source);
        gameProcessEvent.mPlayer = playerFrom;
        gameProcessEvent.mNextPlayer = playerTo;
        return gameProcessEvent;
    }

    /**
     * Игровое событие "игрок закончил заход".
     *
     * @param source источник события
     * @param player игрок, который принял решение.
     * @return событие
     */
    static public GameProcessEvent playerRoundEnded(Object source, Player player) {
        GameProcessEvent gameProcessEvent = new GameProcessEvent(source);
        gameProcessEvent.mPlayer = player;
        return gameProcessEvent;
    }

    /**
     * Игровое событие "игрок проверяет карту на кону".
     *
     * @param source источник события
     * @param player игрок, который проверяет карту на кону
     * @param card карта на кону, которую проверяет игрок
     * @return событие
     */
    static public GameProcessEvent playerChecksCard(Object source, Player player, Card card) {
        GameProcessEvent gameProcessEvent = new GameProcessEvent(source);
        gameProcessEvent.mPlayer = player;
        gameProcessEvent.mCard = card;
        return gameProcessEvent;
    }

    public Player getPlayer() {
        return mPlayer;
    }

    public Player getNextPlayer() {
        return mNextPlayer;
    }

    public boolean getDecision() {
        return mDecisionBelieve;
    }

    public Card getCard() {
        return mCard;
    }

}
